//模式匹配：推断函数参数类型中最后一个参数的类型
function Sum(a: string, b: string, c: number) {}

//第一种写法
//利用Parameters取出函数参数
type LastParams2<T extends (...args: any[]) => any> = Parameters<T> extends [
  ...infer X,
  infer L
]
  ? L
  : never;
type S2 = LastParams2<typeof Sum>;

//第二种写法
//约束参数只是一个函数，只有约束作用
//自我实现Parameters取出函数参数
type LastParams<T extends (...args: any[]) => any> = T extends (
    ...args: infer P
  ) => any
    ? P extends [...infer X, infer L]
      ? L
      : never
    : never;
  type S = LastParams<typeof Sum>;
  

//第三种写法
//自我实现Parameters取出函数参数
//比第二种更简洁
type LastParams1<T extends (...args: any[]) => any> = T extends (
  ...args: [...infer X, infer L]
) => any
  ? L
  : never;
type S1 = LastParams1<typeof Sum>;
